From 7ca6d7585fb7ebd5d3d7bb31bcde92e36f75d419 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jonas=20=C3=85dahl?= Date: Thu, 5 Jan 2017 16:01:49 +0800 Subject: [PATCH] wayland: Handle subsurface as popup parent When a subsurface is used as a parent of a popup, GDK needs to traverse up to the transient-for as the next parent, to properly find the parent used by the popup positioner. This is because the parent of a popup must always either be an xdg_popup or an xdg_surface, but traversing the "parent" (in GDK terms) upwards from a subsurface will end up on the fake root window before we hit the actual parent (in Wayland terms). https://bugzilla.gnome.org/show_bug.cgi?id=776225 --- gdk/wayland/gdkwindow-wayland.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gdk/wayland/gdkwindow-wayland.c b/gdk/wayland/gdkwindow-wayland.c index 2348d4123a..674dac5b68 100644 --- a/gdk/wayland/gdkwindow-wayland.c +++ b/gdk/wayland/gdkwindow-wayland.c @@ -1641,13 +1641,25 @@ get_real_parent_and_translate (GdkWindow *window, GdkWindowImplWayland *impl = GDK_WINDOW_IMPL_WAYLAND (window->impl); GdkWindow *parent = impl->transient_for; - while (parent && - !gdk_window_has_native (parent) && - gdk_window_get_parent (parent)) + while (parent) { + GdkWindowImplWayland *parent_impl = + GDK_WINDOW_IMPL_WAYLAND (parent->impl); + GdkWindow *effective_parent = gdk_window_get_parent (parent); + + if ((gdk_window_has_native (parent) && + !parent_impl->display_server.wl_subsurface) || + !effective_parent) + break; + *x += parent->x; *y += parent->y; - parent = gdk_window_get_parent (parent); + + if (gdk_window_has_native (parent) && + parent_impl->display_server.wl_subsurface) + parent = parent->transient_for; + else + parent = effective_parent; } return parent; -- 2.30.2